package com.example.jdk7;

import java.io.IOException;
import java.nio.file.*;

import static java.nio.file.StandardWatchEventKinds.*;

public class MyWatchService {
    //监听文件系统更改
    public static void main(String[] args) throws Exception {
//        我们用IDE（例如Eclipse）编程，外部更改了代码文件，IDE马上提升“文件有更改”。Jdk7的NIO2.0也提供
//        了这个功能，用于监听文件系统的更改。它采用类似观察者的模式，注册相关的文件更改事件（新建，删除
//……），当事件发生的，通知相关的监听者

        //java.nio.file.*包提供了一个文件更改通知API,叫做Watch Service API.

//        实现流程如下
//        1.为文件系统创建一个WatchService 实例 watcher
//        2.为你想监听的目录注册 watcher。注册时，要注明监听那些事件。
//        3.在无限循环里面等待事件的触发。当一个事件发生时，key发出信号，并且加入到watcher的queue
//        4.从watcher的queue查找到key，你可以从中获取到文件名等相关信息
//        5.遍历key的各种事件
//        6.重置 key，重新等待事件
//        7.关闭服务

        Path watchPath = Paths.get("E:/Java7watch");
        MyWatchService j7 = new MyWatchService(watchPath);
        j7.handleEvents();


//        if (args.length != 1) {
//            System.out.println("请设置要监听的文件目录作为参数");
//            System.exit(-1);
//        }
//        new java7Test5(Paths.get(args[0])).handleEvents();

    }

    private WatchService watcher;

    public MyWatchService(Path path) throws IOException {
        watcher = FileSystems.getDefault().newWatchService();
        path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
    }

    public void handleEvents() throws InterruptedException {
        while (true) {
            WatchKey key = watcher.take();
            for (WatchEvent<?> event : key.pollEvents()) {
                WatchEvent.Kind kind = event.kind();
                if (kind == OVERFLOW) {//事件可能lost or discarded
                    continue;
                }
                WatchEvent<Path> e = (WatchEvent<Path>) event;
                Path fileName = e.context();
                System.out.printf("Event %s has happened,which fileName is %s%n", kind.name(), fileName);
            }
            if (!key.reset()) {
                break;
            }
        }
    }

}
